

----------------------------------------------------------------
--- Copyright：  迷你玩-海马
--- Description：服务器之间互相调用的时候使用  (会使用 [ma_gate网关] 做路由和负载均衡)
---
--- 如果一个请求 /miniw/map 在网关上有路由配置，则可以通过 gate_rpc 来进行远程模块调用

---  1 随机轮训获得一个网关地址
---  2 组装url链接，计算auth或者token
---  3 发送http请求

----------------------------------------------------------------
local require    = require
local table      = table
local ngx = ngx

----数据变量----
local ns_env     = require("modules.env.env")          ---应该与具体环境无关
local uu         = require("modules.commhm.utils");
local log        = require("modules.commhm.log");
local ns_time    = require("modules.commhm.time");
local ns_network = require("modules.commhm.network");

local ns_auth_comm_checker = require("modules.commhm.auth_comm_checker")
local ns_const_url_mgr     = require("modules.commhm.framework.const_url_mgr")


local FOO = {
	_VERSION = '0.12.1',
}


--- 通过 cmd=XXX  调用一个服务器的内部接口 (函数内计算token)
--- path_: 路径         例子： /miniw/map    /miniw/profile
--- pps_:  参数列表     例子： { uin=112233, cmd=getProfile, op_uin=1234567 }
---
--- ctrl_: 控制参数 (详情见代码部分)
---			string=1       返回值是一个字符串，不用特别解析
---			json=1         返回值是一个json，需要讲json str解析成lua-table返回
---			postfix        放在url后面的额外附加参数
---         expire_time    调用超时时间
---         only_get_url   只获得url，不发起调用
---
--- out_ip_： 1=需要走外网ip (比如需要跨腾讯云，华为云，阿里云)   其他=内网ip
---
--- 返回值：  http返回码 + lua-table(除非指定了 ctrl_.string=1 或者 ctrl_.json=1 )
function FOO.call_cmd( path_, pps_, ctrl_, out_ip_ )

	if  not (path_ and pps_ and pps_.uin and pps_.cmd) then
		log.error( "error_params pps" )
		return 500, 'error_params'
	end

	-- 1 获得网关路径
	local gate_urls_
	if  out_ip_ == 1 then
		gate_urls_ = ns_const_url_mgr.get_ma_gate_url_cross()
	else
		gate_urls_ = ns_const_url_mgr.get_ma_gate_url()
	end

	-- 2 补充必要参数
	if  not pps_.time then
		pps_.time = uu.now()
	end
	if  not pps_.token then
		pps_.token = ns_auth_comm_checker.gen_comm_inner_token( pps_.uin, pps_.time, pps_.cmd );
	end

	-- 3 打包url
	local all_url_ = gate_urls_ .. path_ .. '?' .. ngx.encode_args( pps_ )

	-- 4 额外参数
	local expire_time_
	if  ctrl_ then
		if  ctrl_.postfix then
			all_url_ = all_url_ .. ctrl_.postfix      --额外附加参数
		end

		if  ctrl_.only_get_url == 1 then
			return all_url_                           --只计算url，不发起调用
		end

		if  ctrl_.expire_time then
			expire_time_ = ctrl_.expire_time          --超时时间 （毫秒）
		end
	end
	log.debug( 'all_url=' .. all_url_ )


	-- 5 调用url
	local ret_, body_ = ns_network.getHttpPage( all_url_, nil, nil, expire_time_ )
	if  ret_ == 200 then
		if  ctrl_ then
			if  ctrl_.json == 1 then
				return 200, uu.json2table( body_ );    --json
			elseif ctrl_.string == 1 then
				return 200, body_                      --直接返回字符串string
			else
				return 200, table.loadstring(body_)    --lua
			end
		else
			return 200, table.loadstring(body_)
		end
	else
		log.error( 'error_rcp_gate_call_cmd ' .. uu.to_str(ret_) .. ' ' .. uu.to_str(body_)  .. ' '.. all_url_ )
		log.day_list_simple( 'gate_rpc', 'error_call_cmd', ret_, body_, all_url_ )
		return ret_, 'error_http'
	end

end



return FOO;
